import axios, {
    AxiosInstance,
    AxiosError,
    InternalAxiosRequestConfig,
    AxiosResponse,
} from "axios";

//接口地址
const baseURL = '/api';
//创建axios实例
const service: AxiosInstance = axios.create({
    baseURL,
    //超时时间
    timeout: 5000
})

//添加请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        //在发送请求之前做些什么
        try {
            const token = localStorage.getItem("token")
            if (token && token.trim() !== '') {
                console.log('从localStorage获取的token:', token.substring(0, 50) + '...')
                
                // 检查token格式
                if (token.includes('.')) {
                    console.log('JWT token格式检测')
                    const parts = token.split('.')
                    if (parts.length === 3) {
                        console.log('标准JWT格式 (header.payload.signature)')
                        // 检查每个部分是否包含base64url字符
                        parts.forEach((part, index) => {
                            const hasUnderscore = part.includes('_')
                            const hasDash = part.includes('-')
                            console.log(`JWT部分${index + 1}包含_: ${hasUnderscore}, 包含-: ${hasDash}`)
                        })
                    } else {
                        console.warn('非标准JWT格式，部分数量:', parts.length)
                    }
                }
                
                // 安全地设置Authorization头
                // 检查token是否已经包含Bearer前缀
                if (token.startsWith('Bearer ')) {
                    config.headers.Authorization = token
                } else {
                    // 添加Bearer前缀
                    config.headers.Authorization = `Bearer ${token}`
                }
                
                // 如果后端无法处理base64url编码，尝试转换
                // 注意：这可能会破坏JWT的签名验证
                if (token.includes('_') || token.includes('-')) {
                    console.warn('检测到base64url编码字符，可能需要后端支持base64url解码')
                    console.warn('如果后端使用标准Base64解码器，可能需要转换格式')
                }
                
                console.log('最终Authorization头:', config.headers.Authorization.substring(0, 50) + '...')
            }
        } catch (error) {
            console.error('设置token时出错:', error)
            // 清除可能损坏的token
            localStorage.removeItem('token')
        }

        return config
    },
    (error: AxiosError) => {
        //对请求错误做些什么
        console.log(error, "请求错误:request-error");

        return Promise.reject(error)
    }
)

//添加响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        //对响应数据做点什么

        return response.data;
    },
    (error: AxiosError) => {
        //对响应错误做点什么
        console.log(error, "响应错误:response-error");

        if (error && error.response) {
            switch (error.response.status) {
                case 300:
                    error.message = '连接错误';
                    break;
                case 400:
                    error.message = '请求错误';
                    break;
                case 401:
                    error.message = '未授权，请登录';
                    // 清除无效的token
                    localStorage.removeItem('token')
                    localStorage.removeItem('userInfo')
                    // 可以在这里添加跳转到登录页的逻辑
                    break;
                case 403:
                    error.message = '拒绝访问';
                    break;
                case 404:
                    error.message = `请求地址出错: ${error.response.config.url}`;
                    break;
                case 408:
                    error.message = '请求超时';
                    break;
                case 500:
                    error.message = '服务器内部错误';
                    break;
                case 501:
                    error.message = '服务未实现';
                    break;
                case 502:
                    error.message = '网关错误';
                    break;
                case 503:
                    error.message = '服务不可用';
                    break;
                case 504:
                    error.message = '网关超时';
                    break;
            }

            let errorInfo = {
                code: error.response.status,
                message: error.message
            };

            console.log("errorInfo:", errorInfo);
        }else{
            let errorInfo = {
                message: error.message
            };
            console.log("errorInfo:", errorInfo);
        }

        //可以对错误信息进行集中操作，统一管理
        return Promise.reject(error);
    }
)

export default service;